package com.cskaoyan.javase._1extends._3advantage;

/**
 * 这里给出一个继承语法的练习案例，通过案例我们来分析一下继承的优缺点：
 * 练习：
 * 在一款游戏中，我们设计了三种类型的鸭子
 * 这些鸭子有一些共同的属性，也有共会同的行为，比如都可以叫，都游泳等。
 * 编写程序，描述这些鸭子。
 * 后来，需求更改了，这些鸭子不能游泳了，但是都会飞，怎么改呢？
 * 再后来，需求又改了，新增了一种鸭子，但这个鸭子不会飞，又怎么办呢？
 *
 * 继承的优缺点
 * 优点:
 *      1.继承的出现,打破了Java引用数据类型的类型限制
 *          使得引用数据类型出现了类型转换
 *          这其实是多态的前提
 *      2.继承的出现减少了代码冗余，提高了代码的复用性。
 *      3.继承的出现，更有利于功能的扩展，提升了程序的可维护性，更好地应对需求变更。
 *
 * 缺点:
 * 子类继承父类必须无条件接收父类的所有成员，是没有选择的。
 * 父类中对成员进行修改，会严格体现到每一个子类中，我们不可选择具体哪个子类生效。
 *
 * 扩展:
 * 虽然父类中的方法必须要继承,但是子类在继承方法后,可以选择重写父类方法的实现
 * 这就是"方法的覆盖/重写 override"
 *
 * @since 17:38
 * @author wuguidong@cskaoyan.onaliyun.com
 */
public class Demo {
    public static void main(String[] args) {
        SecondTypeDuck std = new SecondTypeDuck();
        std.shout();
        System.out.println(std.age);
        // std.swim();
        std.fly();

        ForthTypeDuck ftd = new ForthTypeDuck();
        ftd.fly();
    }
}

class DuckFather {
    String name;
    int age;

    public void shout() {
        System.out.println("嘎嘎嘎~");
    }

    /*public void swim() {
        System.out.println("白毛浮绿水,红掌拨清波");
    }*/
    public void fly() {
        System.out.println("原来我是丑小鸭!");
    }
}

class FirstTypeDuck extends DuckFather {
}

class SecondTypeDuck extends DuckFather {
}

class ThirdTypeDuck extends DuckFather {
}

// 新增了一种鸭子，但这个鸭子不会飞
class ForthTypeDuck extends DuckFather {
    // 方法的重写
    @Override
    public void fly() {
        System.out.println("我是小丑,我不会飞!");
    }
}